package com.leyou.trade.service.impl;

import com.leyou.auth.utils.UserContext;
import com.leyou.trade.entity.CartItem;
import com.leyou.trade.repository.CartItemRepository;
import com.leyou.trade.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    CartItemRepository repository;

    @Autowired
    MongoTemplate mongoTemplate;

    @Override
    public void saveCartItem(CartItem cartItem) {
        // 1.根据上下文获取用户信息
        Long userId = UserContext.getUser().getId();
        // 2.查询购物车商品 ：
        // 先构造出要查询的id，去MongoDB查询，如果存在，去改变库存
        // 若不存在，则添加该库存

        //得到查询id
        String id = createId(cartItem.getSkuId());
        Optional<CartItem> optional = repository.findById(id);
        // 3.判断购物车中是否存在与要添加的商品id一致的商品
        if(optional.isPresent()){
            // 2.1.存在，记录新的商品数量
            Integer num = cartItem.getNum();
            // 2.2.获取旧的数据
            cartItem = optional.get();
            // 2.3.数量累加
            cartItem.setNum(num + cartItem.getNum());
        }
        // 4.补充数据，id、userId、时间
        cartItem.setId(id);
        cartItem.setUserId(userId);
        cartItem.setUpdateTime(new Date());
        // 5.写入db
        repository.save(cartItem);
    }

    //用于将用户id和skuId拼接，得到id，用来保证用户唯一性的同时还能有序
    //存储与取出时候格式应该要一致
    private String createId(Long skuId){
        return String.format("u%ds%d", UserContext.getUser().getId(), skuId);
    }


    @Override
    public List<CartItem> queryCartList() {
        // 1.获取用户信息
        Long userId = UserContext.getUser().getId();
        // 2.查询购物车
        return repository.findByUserId(userId, Sort.by("updateTime").descending());
    }

    //复杂实现
    @Override
    public void updateNum(Long skuId, Integer num) {
        mongoTemplate.update(CartItem.class)
                //根据id匹配
        .matching(Query.query(Criteria.where("_id").is(createId(skuId))))
                //更新num字段
                .apply(Update.update("num",num))
                //更新一个
                .first();
    }

    @Override
    public void deleteCart(Long skuId) {
        repository.deleteById(createId(skuId));
//        //获取存储的id
//        String id = createId(skuId);
//        mongoTemplate.remove(CartItem.class)
//                .matching(Query.query(Criteria.where("_id").is(id)))
//                //查询出来应该是只有一个
//                .one();
    }

    @Override
    public void addCartItemList(List<CartItem> cartItems) {
        // 1.获取用户id
        Long userId = UserContext.getUser().getId();
        List<CartItem> itemList = queryCartList();
        // 2.转换
        for (CartItem c:cartItems) {
            String id = createId(c.getSkuId());
            List<String> collect = itemList.stream().map(CartItem::getId).collect(Collectors.toList());
            //如果包含sku则添加数量，否则就新增一个
            if (collect.contains(createId(c.getSkuId()))){
                updateNum(c.getSkuId(),c.getNum());
            }else {
                saveCartItem(c);
            }
        }
    }


}